<html>
    <head>
        <title>IBlobContainer    Blob容器</title>
    </head>
    <body>
        <script>
            /*
                        三、IBlobContainer 容器

                                IBlobContainer 是"存储" 和 "读取" BLOB 的主接口。

                                你的应用程序可能有"多个容器"，每个容器都可以单独配置。
                                

                                ★、（默认容器就是直接注入IBlobContainer）
                                但是，有一个"默认容器"可以简单地通过注入IBlobContainer服务来使用。

                                eg：简单地保存和读取命名BLOB的字节

                                            using System.Threading.Tasks;
                                            using Volo.Abp.BlobStoring;
                                            using Volo.Abp.DependencyInjection;

                                            namespace AbpDemo
                                            {
                                                public class MyService : ITransientDependency
                                                {
                                                    private readonly IBlobContainer _blobContainer;

                                                    public MyService(IBlobContainer blobContainer)
                                                    {
                                                        _blobContainer = blobContainer;  // 注入IBlobContainer服务
                                                    }

                                                    // 保存BLOB对象到默认容器中
                                                    public async Task SaveBytesAsync(byte[] bytes)
                                                    {
                                                        await _blobContainer.SaveAsync("my-blob-1", bytes);
                                                    }
                                                    
                                                    // 从默认容器中读取BLOB对象
                                                    public async Task<byte[]> GetBytesAsync()
                                                    {
                                                        return await _blobContainer.GetAllBytesOrNullAsync("my-blob-1"); // 获取指定名称的BLOB对象字节数组，如果找不到则返回null
                                                    }
                                                }
                                            }

                                        此服务使用my-blob-1名称保存给定字节，然后获取先前保存的同名字节。

                                    BLOB是一个命名对象，每个BLOB都应该有一个唯一的名称，它是一个任意字符串。
                                        
                                    IBlobContainer 可以使用Stream 和 byte[] 对象，这将在下一节中详细介绍。


                                1、保存BLOB
                                        SaveAsync 方法用于保存新的BLOM或替换现有的BLOB。

                                        它可以默认保存一个Stream，但有一个快捷扩展方法来保存字节数组。

                                        SaveAsync 方法，可以获取以下参数：

                                                ①、name (string): BLOB的唯一名称。

                                                ②、stream (Stream) 或者 bytes (byte[]): 要保存的BLOB内容。

                                                ③、overrideExeption (bool): 如果BLOB内容已经存在，则设置true可以替换它。
                                                                            默认为false，如果容器中已经有个同名的BLOB，则抛出 BlobAlreadyExistsException。


                                2、读取BLOB
                                    
                                        ①、GetAsync：仅获取一个BLOB名称并返回一个可用于读取BLOB内容的Stream对象。
                                                     使用后始终释放流。
                                                     如果找不到具有给定名称的BLOB，此方法会引发异常。

                                        ②、GetOrNullAsync：与GetAsync方法相反，如果没有找到具有给定名称的BLOB，则此方法返回null。

                                        ③、GetAllBytesAsync：返回byte[]而不是Stream。如果找不到具有给定名称的BLOB，仍然会引发异常。

                                        ④、GetAllBytesOrNullAsync：与GetAllBytesAsync方法相反，如果没有找到具有给定名称的BLOB，则此方法返回null。


                                3、删除BLOB
                                                        
                                        DeleteAsync，方法获取BLOB名称并删除BLOB数据。如果未找到给定的BLOB，它不会引发任何异常。
                                                    相反，如果你关心它，它会返回一个bool，指示BLOB是否已实际删除。
                                                     
                                4、其他方法

                                        ExistsAsync方法只是检查容器中是否有具有给定名称的BLOB。


                                5、 关于命名BLOB

                                        没有命名BLOB的规则。

                                        BLOB名称只是每个容器（和每个租户）唯一的字符串。 但是，不同的存储提供程序可能会安惯例实施一些做法。

                                        例如，文件系统提供商在你的BLOB名称中使用目录分隔符（/）和文件扩展名（如果你的BLOB名称是images/common/x.png，那么它将保存为x.png在根容器文件夹内的images/common文件夹中）。
                    */

        </script>
    </body>
</html>